/*
Copyright 2024 - 2025 Zen HuiFer

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package models

import (
	"gorm.io/gorm"
	"time"
)

type MqttClient struct {
	Host         string `json:"host"`                    // 主机
	Port         int    `json:"port"`                    // 端口
	ClientId     string `json:"client_id"`               // 客户端id
	Username     string `json:"username"`                // 账号
	Password     string `json:"password"`                // 密码
	Subtopic     string `json:"subtopic"`                // 订阅的主题
	Start        bool   `json:"start"`                   // 是否启动
	LastPushTime string `json:"last_push_time" gorm:"-"` // 最后推送时间
	Script       string `json:"script" gorm:"type:text"` // 数据处理脚本
	gorm.Model   `structs:"-"`
}

type Signal struct {
	Protocol   string `json:"protocol"` // 协议
	IdentificationCode string `json:"identification_code"` // 设备标识码
	DeviceUid int    `json:"device_uid"`                                        // 联网设备ID
	Name           string `json:"name"`                            // 信号的名称，用于标识不同的信号
	Alias          string `json:"alias" structs:"alias"`           // 信号的别名，用于显示
	Type           string `json:"type"`                            // 信号的数据类型，如整数、字符串等
	MqttClientName string `gorm:"-" json:"mqtt_client_name"`       // MQTT客户端的名称，不存储在数据库中
	Unit           string `json:"unit" structs:"unit"`             // 单位
	CacheSize      int    `json:"cache_size" structs:"cache_size"` // 缓存大小
	gorm.Model     `structs:"-"`
}
type SignalWaringConfig struct {
	SignalId     int     `gorm:"signal_id"  json:"signal_id" structs:"signal_id"` // 信号表的外键ID
	Min          float64 `gorm:"min"  json:"min" structs:"min"`                   // 范围,小值
	Max          float64 `gorm:"max"  json:"max" structs:"max"`                   // 范围,大值
	InOrOut      int     `gorm:"in_or_out"  json:"in_or_out" structs:"in_or_out"` //范围内报警,范围外报警 1 范围内报警 0 范围外报警
	Protocol   string `json:"protocol" structs:"protocol"`
	IdentificationCode string `json:"identification_code" structs:"identification_code"` // 设备标识码
	DeviceUid int    `json:"device_uid" structs:"device_uid"`                                        // MQTT客户端表的外键ID
	gorm.Model   `structs:"-"`
	Signal       Signal `gorm:"-" json:"signal" structs:"-"`
}

// SignalDelayWaring : 允许信号数据做一定条数的暂存
type SignalDelayWaring struct {
	Name       string `json:"name" structs:"name"`     // 名称
	Script     string `json:"script" gorm:"type:text"` // 数据处理脚本
	gorm.Model `structs:"-"`
}

type SignalDelayWaringParam struct {
	MqttClientName      string `gorm:"-" json:"mqtt_client_name"`                             // MQTT客户端的名称，不存储在数据库中
	Protocol   string `json:"protocol" structs:"protocol"`

	IdentificationCode string `json:"identification_code" structs:"identification_code"` // 设备标识码

	DeviceUid int    `json:"device_uid" structs:"device_uid"`                                        // MQTT客户端表的外键ID

	Name                string `json:"name"`                                                  // 参数名称
	SignalName          string `gorm:"signal_name"  json:"signal_name" structs:"signal_name"` // 信号表 name
	SignalId            int    `gorm:"signal_id"  json:"signal_id" structs:"signal_id"`       // 信号表的外键ID
	SignalDelayWaringId int    `json:"signal_delay_waring_id"`                                // SignalDelayWaring 主键
	gorm.Model          `structs:"-"`
}

type NodeInfo struct {
	Host string `json:"host,omitempty" yaml:"host,omitempty"`
	Port int    `json:"port,omitempty" yaml:"port,omitempty"`
	Name string `json:"name,omitempty" yaml:"name,omitempty"`
	Type string `json:"type,omitempty" yaml:"type,omitempty"`
	Size int64  `json:"size,omitempty" yaml:"size,omitempty"` // 最大处理数量
}

// CalcRule 计算规则
type CalcRule struct {
	Name       string `json:"name" structs:"name"`                              // 任务名称
	Cron       string `json:"cron"`                                             // 定时任务执行周期
	Script     string `json:"script" gorm:"type:text"`                          // 数据处理脚本
	Offset     int64  `json:"offset" structs:"offset"`                          // 执行时间往前推移几秒
	Start      bool   `json:"start" structs:"start"`                            // 是否启动
	MockValue  string `json:"mock_value" structs:"mock_value" gorm:"type:text"` // 模拟数据
	gorm.Model `structs:"-"`
}

// CalcParam 计算参数
type CalcParam struct {
	Protocol   string `json:"protocol"`
	IdentificationCode string `json:"identification_code"` // 设备标识码
	DeviceUid int    `json:"device_uid"`                                        // MQTT客户端表的外键ID
	Name           string `json:"name"`                                                  // 参数名称
	SignalId       int    `gorm:"signal_id"  json:"signal_id" structs:"signal_id"`       // 信号表的外键ID
	Reduce         string `json:"reduce"`                                                // 数据聚合方式 1. mean 2. sum 3.
	// max 4. min 5. 原始
	CalcRuleId     int    `json:"calc_rule_id"`                                          // CalcRule 主键
	MqttClientName string `gorm:"-" json:"mqtt_client_name"`                             // MQTT客户端的名称，不存储在数据库中
	gorm.Model     `structs:"-"`
}

// Dashboard 可视化板
type Dashboard struct {
	Name       string `json:"name"`                    // 名称
	Config     string `json:"config" gorm:"type:text"` // 配置
	gorm.Model `structs:"-"`
}

// Product 产品
type Product struct {
	Name           string  `json:"name"`                                      // 产品名称
	Description    string  `json:"description" structs:"description"`         // 产品描述
	SKU            string  `json:"sku" structs:"sku"`                         // 库存单位
	Price          float64 `json:"price" structs:"price"`                     // 销售价格
	Cost           float64 `json:"cost" structs:"cost"`                       // 成本
	Quantity       int     `json:"quantity" structs:"quantity"`               // 库存数量
	MinimumStock   int     `json:"minimum_stock" structs:"minimum_stock"`     // 最低库存量
	WarrantyPeriod int     `json:"warranty_period" structs:"warranty_period"` // 质保时间（天）
	Status         string  `json:"status" structs:"status"`                   // 产品状态
	Tags           string  `json:"tags" structs:"tags"`                       // 标签
	ImageURL       string  `json:"image_url" structs:"image_url"`             // 图片URL
	gorm.Model     `structs:"-"`
}

// DeviceInfo 设备信息
type DeviceInfo struct {
	ProductId         uint      `json:"product_id" structs:"product_id"`                                                                     // 产品ID
	SN                string    `json:"sn" structs:"sn"`                                                                                     // 设备编号
	ManufacturingDate time.Time `json:"manufacturing_date,omitempty" gorm:"type:DATETIME; default:NULL;" structs:"manufacturing_date"`       // 制造日期
	ProcurementDate   time.Time `json:"procurement_date,omitempty" gorm:"type:DATETIME; default:NULL;" structs:"procurement_date,omitempty"` // 采购日期
	Source            int       `json:"source" structs:"source"`                                                                             // 设备来源,1: 内部,2: 外源
	WarrantyExpiry    time.Time `json:"warranty_expiry,omitempty" gorm:"type:DATETIME; default:NULL;" structs:"warranty_expiry"`             // 保修截止日期
	PushInterval      int       `json:"push_interval,omitempty" structs:"push_interval"`                                                     // 推送间隔（秒）
	ErrorRate         float64   `json:"error_rate,omitempty" structs:"error_rate"`                                                           // 推送时间误差（秒）
	Protocol          string `json:"protocol,omitempty" structs:"protocol,omitempty"`                                                                         // 协议
	IdentificationCode string `json:"identification_code"` // 设备标识码
	DeviceUid int    `json:"device_uid"`                                        // 联网设备ID
	gorm.Model        `structs:"-"`
}

func (d *DeviceInfo) BeforeSave(tx *gorm.DB) (err error) {
	if d.ProcurementDate.IsZero() {
		gorm.Expr("NULL")
	}
	return
}

// DeviceGroup 设备组
type DeviceGroup struct {
	Name       string `json:"name" structs:"name"` // 名称
	gorm.Model `structs:"-"`
}

// DeviceGroupDevice 设备组与设备信息的关联表
type DeviceGroupDevice struct {
	DeviceInfoId       uint `json:"device_info_id" structs:"device_info_id" gorm:"column:device_info_id;"`   // 设备表的外键ID
	DeviceGroupGroupId uint `json:"device_group_id" structs:"device_group_id" gorm:"column:device_group_id;"` // 设备组表的外键ID
	gorm.Model         `structs:"-"`
}

// DeviceInstallRecord 设备安装记录
type DeviceInstallRecord struct {
	gorm.Model         `structs:"-"`
	DeviceGroupGroupId uint      `json:"device_group_id" structs:"device_group_id"` // 设备组表的外键ID
	DeviceInfoId       uint      `json:"device_info_id" structs:"device_info_id"`   // 设备表的外键ID
	InstallDate        time.Time `json:"install_date" structs:"install_date"`       // 安装日期
	Technician         string    `json:"technician" structs:"technician"`           // 安装人员
	Description        string    `json:"description" structs:"description"`         // 安装描述
	PhotoURL           string    `json:"photo_url" structs:"photo_url"`             // 照片URL
}

// RepairRecord 维修记录
type RepairRecord struct {
	DeviceGroupGroupId uint      `json:"device_group_id" structs:"device_group_id"` // 设备组表的外键ID
	DeviceInfoId       uint      `json:"device_info_id" structs:"device_info_id"`   // 设备表的外键ID
	RepairDate         time.Time `json:"repair_date" structs:"repair_date"`         // 维修日期
	Technician         string    `json:"technician" structs:"technician"`           // 维修人员
	Cost               float64   `json:"cost" structs:"cost"`                       // 维修成本
	Description        string    `json:"description" structs:"description"`         // 维修描述
	gorm.Model         `structs:"-"`
}

// ShipmentRecord 发货记录
type ShipmentRecord struct {
	gorm.Model      `structs:"-"`
	ShipmentDate    time.Time `json:"shipment_date" structs:"shipment_date"`       // 发货日期
	Technician      string    `json:"technician" structs:"technician"`             // 发货人员
	CustomerName    string    `json:"customer_name" structs:"customer_name"`       // 客户名称
	CustomerPhone   string    `json:"customer_phone" structs:"customer_phone"`     // 客户手机
	CustomerAddress string    `json:"customer_address" structs:"customer_address"` // 客户地址
	TrackingNumber  string    `json:"tracking_number" structs:"tracking_number"`   // 跟踪号码
	Status          string    `json:"status" structs:"status"`                     // 发货状态（例如：pending, shipped, delivered）
	Description     string    `json:"description" structs:"description"`           // 发货描述
}

// ShipmentProductDetail 发货记录中的具体产品
type ShipmentProductDetail struct {
	gorm.Model       `structs:"-"`
	ShipmentRecordId uint `json:"shipment_record_id" structs:"shipment_record_id"` // 发货记录ID
	ProductID        uint `json:"product_id" structs:"product_id"`                 // 关联的产品ID
	DeviceInfoId     uint `json:"device_info_id" structs:"device_info_id"`         // 设备表的外键ID
	Quantity         int  `json:"quantity" structs:"quantity"`                     // 发货数量
}

// ProductionPlan 表示生产计划
type ProductionPlan struct {
	gorm.Model  `structs:"-"`
	Name        string    `json:"name" structs:"name"`               // 生产计划名称
	StartDate   time.Time `json:"start_date" structs:"start_date"`   // 生产计划开始日期
	EndDate     time.Time `json:"end_date" structs:"end_date"`       // 生产计划结束日期
	Description string    `json:"description" structs:"description"` // 生产计划描述
	Status      string    `json:"status" structs:"status"`           // 计划状态（1准备中,2进行中, 3已完成）
}

// ProductPlan 表示生产计划中的具体产品计划
type ProductPlan struct {
	gorm.Model       `structs:"-"`
	ProductionPlanID uint `json:"production_plan_id" structs:"production_plan_id"` // 关联的生产计划ID
	ProductID        uint `json:"product_id" structs:"product_id"`                 // 关联的产品ID
	Quantity         int  `json:"quantity" structs:"quantity"`                     // 计划生产数量
}

type User struct {
	gorm.Model `structs:"-"`
	Username   string `json:"username" structs:"username"` // 用户名
	Password   string `json:"password" structs:"password"` // 密码
	Email      string `json:"email" structs:"email"`       // 电子邮箱
	Status     string `json:"status" structs:"status"`     // 用户状态（例如：active, inactive）
}

type Role struct {
	gorm.Model  `structs:"-"`
	Name        string `json:"name" structs:"name"`               // 角色名
	Description string `json:"description" structs:"description"` // 角色描述
	CanDel      bool   `json:"can_del" structs:"can_del"`         // 是否可以删除
}

type UserDept struct {
	gorm.Model `structs:"-"`
	UserId     uint `json:"user_id" structs:"user_id"` // 用户ID
	DeptId     uint `json:"dept_id" structs:"dept_id"` // 部门ID

}

type UserRole struct {
	gorm.Model `structs:"-"`
	UserId     uint `json:"user_id" structs:"user_id"` // 用户ID
	RoleId     uint `json:"role_id" structs:"role_id"` // 角色ID
}
type Dept struct {
	gorm.Model `structs:"-"`
	Name       string `json:"name" structs:"name"`                                  // 部门名
	ParentId   uint   `json:"parent_id,omitempty" structs:"parent_id"`              // 父部门ID
	ParentName string `json:"parent_name,omitempty" gorm:"-" structs:"parent_name"` // 父部门名称
}

type UserBindDeviceInfo struct {
	gorm.Model `structs:"-"`
	UserId     uint `json:"user_id" structs:"user_id"`     // 用户ID
	DeviceId   uint `json:"device_id" structs:"device_id"` // 设备ID
}



// TcpHandler 表示TCP数据处理器
type TcpHandler struct {
	gorm.Model `structs:"-"`
	DeviceInfoId       uint   `json:"device_info_id" structs:"device_info_id"`           // 设备ID
	Username     string `json:"username" structs:"username"`             // 用户名
	Password     string `json:"password" structs:"password"`             // 密码
	Name       string `json:"name" structs:"name"`     // 处理器名
	Script     string `json:"script" structs:"script"` // 处理器脚本
}

type HttpHandler struct {
	DeviceInfoId uint   `json:"device_info_id" structs:"device_info_id"` // 设备ID
	Name         string `json:"name" structs:"name"`                     // 处理器名
	Username     string `json:"username" structs:"username"`             // 用户名
	Password     string `json:"password" structs:"password"`             // 密码
	Script       string `json:"script" structs:"script"`                 // 脚本
	gorm.Model   `structs:"-"`
}

type CoapHandler struct {
	DeviceInfoId uint   `json:"device_info_id" structs:"device_info_id"` // 设备ID
	Name         string `json:"name" structs:"name"`                     // 处理器名
	Username     string `json:"username" structs:"username"`             // 用户名
	Password     string `json:"password" structs:"password"`             // 密码
	Script       string `json:"script" structs:"script"`                 // 脚本
	gorm.Model   `structs:"-"`
}

type WebsocketHandler struct {
	DeviceInfoId uint   `json:"device_info_id" structs:"device_info_id"` // 设备ID
	Name         string `json:"name" structs:"name"`                     // 处理器名
	Username     string `json:"username" structs:"username"`             // 用户名
	Password     string `json:"password" structs:"password"`             // 密码
	Script       string `json:"script" structs:"script"`                 // 脚本
	gorm.Model   `structs:"-"`
}


type MessageTypeBindRole struct {
	gorm.Model  `structs:"-"`
	MessageType int  `json:"message_type" structs:"message_type"` // 消息类型
	RoleId      uint `json:"role_id" structs:"role_id"`           // 角色ID
}

type MessageList struct {
	gorm.Model    `structs:"-"`
	Content       string `json:"content" structs:"content"`                 // 消息内容
	EnContent     string `json:"en_content" structs:"en_content"`           // 消息内容(英文)
	MessageTypeId int    `json:"message_type_id" structs:"message_type_id"` // 消息类型ID
	RefId         string `json:"ref_id" structs:"ref_id"`                   // 关联的ID
}

// SimCard 表示物联网卡的数据模型
type SimCard struct {
	gorm.Model   `structs:"-"`
	AccessNumber string    `gorm:"column:access_number;type:varchar(20);not null" json:"access_number" structs:"access_number"` //物联网卡的接入号
	ICCID        string    `gorm:"column:iccid;type:varchar(20);not null" json:"iccid" structs:"iccid"`                         // 物联网卡的集成电路卡识别码，唯一标识
	IMSI         string    `gorm:"column:imsi;type:varchar(15);not null" json:"imsi" structs:"imsi"`                            // 物联网卡的国际移动用户识别码，唯一标识
	Operator     string    `gorm:"column:operator;type:varchar(50);not null" json:"operator" structs:"operator"`                //物联网卡的运营商名称
	Expiration   time.Time `gorm:"column:expiration;type:datetime;not null" json:"expiration" structs:"expiration"`             // 物联网卡的到期时间
}

// SimUseHistory 表示物联网卡的使用历史记录
type SimUseHistory struct {
	gorm.Model   `structs:"-"`
	SimId        uint   `json:"sim_id" structs:"sim_id"`                 // 物联网卡ID
	DeviceInfoId uint   `json:"device_info_id" structs:"device_info_id"` // 设备ID
	Description  string `json:"description" structs:"description"`       // 描述
}

// ScriptList 脚本列表，用于快速选择
type ScriptList struct {
	gorm.Model  `structs:"-"`
	Content string `json:"content" structs:"content" gorm:"type:text"` // 脚本内容
	Name string `json:"name" structs:"name" `

}


type DeviceBindHandler struct {
	gorm.Model  `structs:"-"`
	DeviceInfoId       uint      `json:"device_info_id" structs:"device_info_id"`   // 设备表的外键ID
	Protocol   string `json:"protocol"` // 协议
	IdentificationCode string `json:"identification_code"` // 设备标识码
	HandlerId uint `json:"handler_id"` // mqtt client 表主键 、TcpHandler Ws .... id

}